#include "head.h"

void find(int * array, int val) {
	int i, count = 0;
	for (i = 0; i < N; i++) {
		printf("%d ", array[i]);
		if (array[i] == val) {
			count++;
		}
	}
	printf("\nW tablicy znaleziono %d liczb %d, proces %d\n", count, val, getpid());
}

int nr = 0;             // liczba procesów czytelników
int nw = 0;             // liczna procesów pisarzy
int write_request = 0;

int main(int argc, char ** argv) {
	if (argc != 2) {
		printf("Niepoprawne wywołanie. Poprawne wywołanie: ./czytelnik.o <poszukiwana_liczba>\n");
		return -1;
	}
	int szukana = atoi(argv[1]);
	if (szukana <= 0) {
		printf("Szukana liczba musi być większa od 0\n");
		return -2;
	}
	int * values;
	int val_fd, i;
	sem_t * semafor;
	if ((val_fd = shm_open(ARRAY, O_RDWR | O_CREAT, 0666)) == -1) {
		perror("shm_open");
		return -3;
	}
	if ((values = mmap(NULL, sizeof(int)*(N+1), PROT_READ | PROT_WRITE, MAP_SHARED, val_fd, 0)) == MAP_FAILED) {
		perror("mmap");
		return -4;
	}
	if ((semafor = sem_open(WRITER, O_RDWR | O_CREAT, 0666, 1)) == SEM_FAILED) {
		perror("sem_open");
		return -5;
	}
	for (i = 1; i < READER_COUNT; i++)
	{
		 pid_t pid = fork();
		 if (pid < 0) {
		 	perror("fork"); 
		 } else if (pid == 0) {
		 	 break;
		 }
		 sleep(1);
	}
	int can_read;
	while(1) {
		can_read = 1;
		sem_wait(semafor);
		if (nw == 0) {
			nr++;
		} else {
			can_read = 0;
		}
		sem_post(semafor);
		if (can_read) {
			find(values, szukana);
			sleep(1);
			sem_wait(semafor);
			nr--;
			sem_post(semafor);
		}
		sleep(1);
	}
	sem_destroy(semafor);
	return 0;
}


